當我們回顧昨日學習的 jq 語法中 if-then-else-end
結構時,發現可能有更優雅的表達方式。今天,我們將進一步探討 jq 中變數的應用,改善寫法。
師傅:今天我們學習 jq 中變數的使用。
徒弟:好的,師傅。我們之前用過 if-then-else 來處理方向,用變數會更好嗎?該怎麼做呢?
師傅:首先,我們可以將"方向對應關係"定義為變數。
徒弟:哦,是像字典那樣嗎?
師傅:沒錯。看這個:
jq -n '{"N": "北 ↑", "S": "南 ↓", "E": "東 →", "W": "西 ←", "NE": "東北 ↗", "SE": "東南 ↘", "SW": "西南 ↙", "NW": "西北 ↖"} as $direction | $direction'
徒弟:我明白了。那麼,我們怎麼使用這個變數$direction
呢?
師傅:使用方括號取值。這樣:$direction[.movingDirection]
徒弟:哦!所以如果 .movingDirection 是 "N",就會顯示 "北 ↑"?
師傅:正確。試試完整的寫法。
徒弟:讓我試試...是這樣嗎?
jq '{"N": "北 ↑", "S": "南 ↓", "E": "東 →", "W": "西 ←", "NE": "東北 ↗", "SE": "東南 ↘", "SW": "西南 ↙", "NW": "西北 ↖"} as $direction | $direction[.movingDirection]'
師傅:很好。這比之前的 if-then-else 結構更簡潔。
徒弟:真的!這樣使用變數感覺更靈活了。
師傅:記住,變數可以讓你的程式碼更易讀、更易維護。
... as $變數名稱 | ...
在 jq 中,變數的使用有以下幾個要點:
拿滯留多日、卻轉眼消逝的山陀兒颱風為例,使用變數之後修改程式碼為:
jq -c -r "{\"N\": \"北 ↑\", \"S\": \"南 ↓\", \"E\": \"東 →\", \"W\": \"西 ←\", \"NE\": \"東北 ↗\", \"SE\": \"東南 ↘\", \"SW\": \"西南 ↙\", \"NW\": \"西北 ↖\"} as $direction|[\"時間 \",\"經度\",\"緯度\",\"氣壓\",\"風速MAX\",\"陣風MAX\",\"方向 \",\"預測\"],[.records.tropicalCyclones.tropicalCyclone[] | select(.typhoonName==\"KRATHON\") | .analysisData.fix[-5:][] | [.fixTime[0:13], (.coordinate|split(\",\")[0]), (.coordinate|split(\",\")[1]), .pressure, .maxWindSpeed, .maxGustSpeed, $direction[.movingDirection], .movingPrediction[0].value]][] | @tsv" typhoon0930.json
於是,留下滿地瘡痍的山陀兒颱風,在文字消息最後的身影:
今天我們認識了 jq 宣告變數、以及使用變數來取值的用法。最常見的使用情境就是如風向對應這種字典的使用方式,可以參考 原始碼。
平安就是福,感謝自己今天也認真地學習了😊。